package com.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.vo.MenuVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ObjectUtils;

import java.util.*;


public class MenuUtil {
//    public static String[] powerList=null;
    /**
     * 无限级菜单的关系设置，可以根据权限设置，权限的格式为“1,2,3,4,...”
     * @param originalMenuList  为设置关系的菜单集合
     * @param powerList     权限
     * @return      设置关系之后的菜单集合
     */
    public static List<MenuVo> setMenuRelative(List<MenuVo> originalMenuList, String powerList){
        if(StringUtils.isNotBlank(powerList) && powerList.indexOf(",,") > -1 ){
            System.out.println("powerList包含了逗号需要去掉" + powerList );//我后面做了判断了，
        }

        if(originalMenuList == null || originalMenuList.size() == 0){
            return new ArrayList<>();
        }
        List<MenuVo> resultList = new ArrayList<>();
        Map<Integer,MenuVo> map = new TreeMap<>();      //把所有的菜单对象放入map集合中方便查询设置菜单的层级关系，key保存的是menuid
        if(powerList == null || "".equals(powerList)){      //只是简单的遍历设置关系
            for(MenuVo menu:originalMenuList){
                menu.setList(new ArrayList<>());
                map.put(menu.getId(),menu);
            }
        }else{      //按照权限遍历设置关系
            String menuIds[] = powerList.split(",");        //根据","把用户的菜单权限拆分
            for(String powerid : menuIds){        //遍历用户权限id集合
                if( StringUtils.isNotBlank(powerid) ){
                    int id = Integer.parseInt(powerid);
                    for(int i = 0 ; i < originalMenuList.size() ; i++){     //根据权限id找到对应的菜单，然后保存在map集合中
                        MenuVo menu = originalMenuList.get(i);
                        if(id == menu.getId()){
                            menu.setList(new ArrayList<>());
                            map.put(id,menu);
                            break;
                        }
                    }
                }
            }
        }

        for(Integer key : map.keySet()){       //遍历map集合，设置子菜单与父菜单的关系
            MenuVo vo = map.get(key);
            if(vo.getParentId() != 0){
                MenuVo parentMenuVo = map.get(vo.getParentId());
                if(ObjectUtils.isEmpty(parentMenuVo)){//有时候登陆不上去，可以查看这个
                    System.out.println("这个菜单id有问题,这个在表admin_menu的id为：" + key);
                    System.out.println("这个菜单id有问题,这个在表admin_menu的id为：" + key);
                    System.out.println("这个菜单id有问题,这个在表admin_menu的id为：" + key);
                }
                parentMenuVo.getList().add(vo);
            }
        }

        for(Map.Entry<Integer,MenuVo> vo : map.entrySet()){        //把map集合中的数据转化为list输出
            if(vo.getValue().getParentId() == 0){
                resultList.add(vo.getValue());
            }
        }
        return resultList;
    }

    /**
     * 生成符合layUI格式的json数据，以递归的方式向下遍历，格式为[{id:"",label:"",children:{...}},{},{}...]
     * @param vo 菜单对象
     * @return  json格式的对象
     */
    public static JSONObject buildTreeData(MenuVo vo, String[] powerList){
        JSONObject obj = new JSONObject();
        JSONArray array = new JSONArray();
        if(vo.getList()==null||vo.getList().size()==0){
            obj.put("id",vo.getId());
            obj.put("label",vo.getTitle());
            if(powerList!=null){
                for(String menuId:powerList){
                    if(vo.getId()==Integer.parseInt(menuId)){
                        obj.put("checked",true);
                        break;
                    }
                }
            }
            return obj;
        }
        for(MenuVo list:vo.getList()){
            JSONObject children = buildTreeData(list,powerList);
            array.add(children);
        }
        obj.put("id",vo.getId());
        obj.put("label",vo.getTitle());
        obj.put("children",array);
        return obj;
    }
}
